package com.hongpu.utils;

import com.hongpu.domain.SysMenu;
import com.hongpu.vo.MenuTreeVo;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 菜单树工具类
 *
 * @author 张玉胜
 * @since 2025年06月06日
 */

public class MenuTreeUtils {
    public static final Long ROOT_MENU_ID = 0L;
    /**
     * 菜单集合
     */
    List<SysMenu> menuList;

    /**
     * 构造方法初始化菜单集合
     */
    public MenuTreeUtils(List<SysMenu> menuList) {
        this.menuList = menuList;
    }

    /**
     * 构建菜单树
     *
     * @return
     */
    public List<MenuTreeVo> buildTree() {
        List<MenuTreeVo> tree = new ArrayList<>();
        // 1、获取所有根节点
        List<MenuTreeVo> rootMenu = getRootMenu();
        // 2、找到当前节点currentMenu下所有子节点
        for (MenuTreeVo root : rootMenu) {
            getChildMenu(root);
            tree.add(root);
        }
        return tree;
    }

    /**
     * 1、获取所有根节点
     */
    private List<MenuTreeVo> getRootMenu() {
        List<MenuTreeVo> rootMenu = new ArrayList<>();
        for (SysMenu menu : menuList) {
            Long parentId = menu.getParentId();
            if (parentId != null && Long.compare(ROOT_MENU_ID, parentId) == 0) {
                MenuTreeVo menuTree = new MenuTreeVo();
                menuTree.setMenuId(menu.getMenuId());
                menuTree.setParentId(menu.getParentId());
                menuTree.setMenuName(menu.getMenuName());
                menuTree.setPerms(menu.getPerms());
                rootMenu.add(menuTree);
            }
        }
        return rootMenu;
    }

    /**
     * 2、找到当前节点currentMenu下所有子节点
     */
    private void getChildMenu(MenuTreeVo currentMenu) {
        // 父节点rootMenu下的所有子节点
        List<MenuTreeVo> children = new ArrayList<>();
        // 父节点的ID
        Long rootId = currentMenu.getMenuId();
        // 从集合menuList中查找所有子节点的parentID == rootId的节点
        for (SysMenu menu : menuList) {
            Long parentId = menu.getParentId();
            if (parentId != null && Long.compare(rootId, menu.getParentId()) == 0) {
                MenuTreeVo menuTree = new MenuTreeVo();
                menuTree.setMenuId(menu.getMenuId());
                menuTree.setParentId(menu.getParentId());
                menuTree.setMenuName(menu.getMenuName());
                menuTree.setPerms(menu.getPerms());
                children.add(menuTree);
            }
        }
        // 如果 children集合不为空，则将children集合赋给当前节点currentMenu
        if (CollectionUtils.isNotEmpty(children)) {
            // 将children集合赋给当前节点currentMenu
            currentMenu.setChildren(children);
            // 继续遍历 children 集合，递归调用 getChildMenu 方法
            for (MenuTreeVo child : children) {
                getChildMenu(child);
            }
        }
    }
}